home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / perl5 / Locale / gettext.pm
Text File  |  2008-06-14  |  7KB  |  284 lines

  1. package Locale::gettext;
  2.  
  3. =head1 NAME
  4.  
  5. Locale::gettext - message handling functions
  6.  
  7. =head1 SYNOPSIS
  8.  
  9.     use Locale::gettext;
  10.     use POSIX;     # Needed for setlocale()
  11.  
  12.     setlocale(LC_MESSAGES, "");
  13.  
  14.     # OO interface
  15.     my $d = Locale::gettext->domain("my_program");
  16.  
  17.     print $d->get("Welcome to my program"), "\n";
  18.             # (printed in the local language)
  19.  
  20.     # Direct access to C functions
  21.     textdomain("my_program");
  22.  
  23.     print gettext("Welcome to my program"), "\n";
  24.             # (printed in the local language)
  25.  
  26. =head1 DESCRIPTION
  27.  
  28. The gettext module permits access from perl to the gettext() family of
  29. functions for retrieving message strings from databases constructed
  30. to internationalize software.
  31.  
  32. =cut
  33.  
  34. use Carp;
  35. use POSIX qw(:locale_h);
  36.  
  37. require Exporter;
  38. require DynaLoader;
  39. @ISA = qw(Exporter DynaLoader);
  40.  
  41. BEGIN {
  42.     eval {
  43.         require Encode;
  44.         $encode_available = 1;
  45.     };
  46.     import Encode if ($encode_available);
  47. }
  48.  
  49. $VERSION = "1.05" ;
  50.  
  51. %EXPORT_TAGS = (
  52.  
  53.     locale_h =>    [qw(LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_ALL)],
  54.  
  55.     libintl_h => [qw(gettext textdomain bindtextdomain dcgettext dgettext ngettext dngettext dcngettext bind_textdomain_codeset)],
  56.  
  57. );
  58.  
  59. Exporter::export_tags();
  60.  
  61. @EXPORT_OK = qw(
  62. );
  63.  
  64. bootstrap Locale::gettext $VERSION;
  65.  
  66. sub AUTOLOAD {
  67.     local $! = 0;
  68.     my $constname = $AUTOLOAD;
  69.     $constname =~ s/.*:://;
  70.     my $val = constant($constname, (@_ ? $_[0] : 0));
  71.     if ($! == 0) {
  72.     *$AUTOLOAD = sub { $val };
  73.     }
  74.     else {
  75.     croak "Missing constant $constname";
  76.     }
  77.     goto &$AUTOLOAD;
  78. }
  79.  
  80. =over 2
  81.  
  82. =item $d = Locale::gettext->domain(DOMAIN)
  83.  
  84. =item $d = Locale::gettext->domain_raw(DOMAIN)
  85.  
  86. Creates a new object for retrieving strings in the domain B<DOMAIN>
  87. and returns it. C<domain> requests that strings be returned as
  88. Perl strings (possibly with wide characters) if possible while
  89. C<domain_raw> requests that octet strings directly from functions
  90. like C<dgettext()>.
  91.  
  92. =cut
  93.  
  94. sub domain_raw {
  95.     my ($class, $domain) = @_;
  96.     my $self = { domain => $domain, raw => 1 };
  97.     bless $self, $class;
  98. }
  99.  
  100. sub domain {
  101.     my ($class, $domain) = @_;
  102.     unless ($encode_available) {
  103.         croak "Encode module not available, cannot use Locale::gettext->domain";
  104.     }
  105.     my $self = { domain => $domain, raw => 0 };
  106.     bless $self, $class;
  107.     eval { bind_textdomain_codeset($self->{domain}, "UTF-8"); };
  108.     if ($@ =~ /not implemented/) {
  109.         # emulate it
  110.         $self->{emulate} = 1;
  111.     } elsif ($@ ne '') {
  112.         die;    # some other problem
  113.     }
  114.     $self;
  115. }
  116.  
  117. =item $d->get(MSGID)
  118.  
  119. Calls C<dgettext()> to return the translated string for the given
  120. B<MSGID>.
  121.  
  122. =cut
  123.  
  124. sub get {
  125.     my ($self, $msgid) = @_;
  126.     $self->_convert(dgettext($self->{domain}, $msgid));
  127. }
  128.  
  129. =item $d->cget(MSGID, CATEGORY)
  130.  
  131. Calls C<dcgettext()> to return the translated string for the given
  132. B<MSGID> in the given B<CATEGORY>.
  133.  
  134. =cut
  135.  
  136. sub cget {
  137.     my ($self, $msgid, $category) = @_;
  138.     $self->_convert(dcgettext($self->{domain}, $msgid, $category));
  139. }
  140.  
  141. =item $d->nget(MSGID, MSGID_PLURAL, N)
  142.  
  143. Calls C<dngettext()> to return the translated string for the given
  144. B<MSGID> or B<MSGID_PLURAL> depending on B<N>.
  145.  
  146. =cut
  147.  
  148. sub nget {
  149.     my ($self, $msgid, $msgid_plural, $n) = @_;
  150.     $self->_convert(dngettext($self->{domain}, $msgid, $msgid_plural, $n));
  151. }
  152.  
  153. =item $d->ncget(MSGID, MSGID_PLURAL, N, CATEGORY)
  154.  
  155. Calls C<dngettext()> to return the translated string for the given
  156. B<MSGID> or B<MSGID_PLURAL> depending on B<N> in the given
  157. B<CATEGORY>.
  158.  
  159. =cut
  160.  
  161. sub ncget {
  162.     my ($self, $msgid, $msgid_plural, $n, $category) = @_;
  163.     $self->_convert(dcngettext($self->{domain}, $msgid, $msgid_plural, $n, $category));
  164. }
  165.  
  166. =item $d->dir([NEWDIR])
  167.  
  168. If B<NEWDIR> is given, calls C<bindtextdomain> to set the
  169. name of the directory where messages for the domain
  170. represented by C<$d> are found. Returns the (possibly changed)
  171. current directory name.
  172.  
  173. =cut
  174.  
  175. sub dir {
  176.     my ($self, $newdir) = @_;
  177.     if (defined($newdir)) {
  178.         bindtextdomain($self->{domain}, $newdir);
  179.     } else {
  180.         bindtextdomain($self->{domain});
  181.     }
  182. }
  183.  
  184. =item $d->codeset([NEWCODE])
  185.  
  186. For instances created with C<Locale::gettext-E<gt>domain_raw>, manuiplates
  187. the character set of the returned strings.
  188. If B<NEWCODE> is given, calls C<bind_textdomain_codeset> to set the
  189. character encoding in which messages for the domain
  190. represented by C<$d> are returned. Returns the (possibly changed)
  191. current encoding name.
  192.  
  193. =cut
  194.  
  195. sub codeset {
  196.     my ($self, $codeset) = @_;
  197.     if ($self->{raw} < 1) {
  198.         warn "Locale::gettext->codeset: meaningful only for instances created with domain_raw";
  199.         return;
  200.     }
  201.     if (defined($codeset)) {
  202.         bind_textdomain_codeset($self->{domain}, $codeset);
  203.     } else {
  204.         bind_textdomain_codeset($self->{domain});
  205.     }
  206. }
  207.  
  208. sub _convert {
  209.     my ($self, $str) = @_;
  210.     return $str if ($self->{raw});
  211.     # thanks to the use of UTF-8 in bind_textdomain_codeset, the
  212.     # result should always be valid UTF-8 when raw mode is not used.
  213.     if ($self->{emulate}) {
  214.         delete $self->{emulate};
  215.         $self->{raw} = 1;
  216.         my $null = $self->get("");
  217.         if ($null =~ /charset=(\S+)/) {
  218.             $self->{decode_from} = $1;
  219.             $self->{raw} = 0;
  220.         } #else matches the behaviour of glibc - no null entry
  221.           # means no conversion is done
  222.     }
  223.     if ($self->{decode_from}) {
  224.         return decode($self->{decode_from}, $str);
  225.     } else {
  226.         return decode_utf8($str);
  227.     }
  228. }
  229.  
  230. sub DESTROY {
  231.     my ($self) = @_;
  232. }
  233.  
  234. =back
  235.  
  236. gettext(), dgettext(), and dcgettext() attempt to retrieve a string
  237. matching their C<msgid> parameter within the context of the current
  238. locale. dcgettext() takes the message's category and the text domain
  239. as parameters while dgettext() defaults to the LC_MESSAGES category
  240. and gettext() defaults to LC_MESSAGES and uses the current text domain.
  241. If the string is not found in the database, then C<msgid> is returned.
  242.  
  243. ngettext(), dngettext(), and dcngettext() function similarily but
  244. implement differentiation of messages between singular and plural.
  245. See the documentation for the corresponding C functions for details.
  246.  
  247. textdomain() sets the current text domain and returns the previously
  248. active domain.
  249.  
  250. I<bindtextdomain(domain, dirname)> instructs the retrieval functions to look
  251. for the databases belonging to domain C<domain> in the directory
  252. C<dirname>
  253.  
  254. I<bind_textdomain_codeset(domain, codeset)> instructs the retrieval
  255. functions to translate the returned messages to the character encoding
  256. given by B<codeset> if the encoding of the message catalog is known.
  257.  
  258. =head1 NOTES
  259.  
  260. Not all platforms provide all of the functions. Functions that are
  261. not available in the underlying C library will not be available in
  262. Perl either.
  263.  
  264. Perl programs should use the object interface. In addition to being
  265. able to return native Perl wide character strings,
  266. C<bind_textdomain_codeset> will be emulated if the C library does
  267. not provide it.
  268.  
  269. =head1 VERSION
  270.  
  271. 1.05.
  272.  
  273. =head1 SEE ALSO
  274.  
  275. gettext(3i), gettext(1), msgfmt(1)
  276.  
  277. =head1 AUTHOR
  278.  
  279. Phillip Vandry <vandry@TZoNE.ORG>
  280.  
  281. =cut
  282.  
  283. 1;
  284.